using Sirenix.OdinInspector;
using UnityEditor;
using UnityEngine;

namespace LightingUtil
{
    /// <summary>
    /// 光照配置档案工具
    /// 
    /// 作用：
    /// 1. 用于保存和恢复场景的光照数据，包括光照贴图、光照探针和光照模式
    /// 2. 在编辑器模式下记录当前的光照设置，方便在不同环境或场景间共享光照配置
    /// 3. 支持将光照探针数据持久化保存为独立的资源文件
    /// 
    /// 使用场景：
    /// - 在不同项目间迁移光照设置
    /// - 备份特定的光照配置方案
    /// - 快速切换不同的光照环境预设
    /// - 团队协作时共享统一的光照配置
    /// 
    /// 功能特点：
    /// - 一键记录当前场景的所有光照数据
    /// - 自动生成光照探针资源文件
    /// - 提供属性接口方便程序化访问光照数据
    /// - 与Unity原生光照系统完全兼容
    /// </summary>
    [CreateAssetMenu(fileName = "LightingProfile", menuName = "Scriptable Objects/Lighting Profile")]
    public class LightingProfile : ScriptableObject
    {
        [SerializeField] [ReadOnly] private LightmapsMode lightmapsMode; // 光照贴图模式
        [SerializeField] [ReadOnly] private LightProbes lightProbes; // 光照探针数据
        [SerializeField] [ReadOnly] private LightmapProxy[] lightmaps; // 光照贴图代理数组

        // 获取光照探针属性
        public LightProbes LightProbes => lightProbes;

        // 获取光照贴图模式属性
        public LightmapsMode LightmapsMode => lightmapsMode;

        // 获取光照贴图数据属性
        public LightmapData[] LightmapData
        {
            get
            {
                // 创建与代理数组长度相同的光照贴图数据数组
                LightmapData[] data = new LightmapData[lightmaps.Length];

                // 遍历所有光照贴图代理，获取对应的光照贴图数据
                for (var i = 0; i < data.Length; i++)
                {
                    data[i] = lightmaps[i].GetLightmap();
                }

                return data;
            }
        }

#if UNITY_EDITOR
        [Button("记录")]
        private void RecordInfos()
        {
            // 记录当前场景的光照贴图设置
            lightmaps = new LightmapProxy[LightmapSettings.lightmaps.Length];

            // 遍历所有光照贴图，创建对应的代理对象
            for (var i = 0; i < lightmaps.Length; i++)
            {
                lightmaps[i] = new LightmapProxy(LightmapSettings.lightmaps[i]);
            }
        }

        // 创建灯光探针资源
        private void CreateLightProbes()
        {
            // 记录当前的光照贴图模式
            lightmapsMode = LightmapSettings.lightmapsMode;

            // 实例化并记录当前的光照探针数据
            lightProbes = Instantiate(LightmapSettings.lightProbes);

            // 获取当前资源路径
            string assetPath = AssetDatabase.GetAssetPath(this);
            string directory = System.IO.Path.GetDirectoryName(assetPath);

            // 创建唯一的资源名称用于保存光照探针
            string lightProbesPath = AssetDatabase.GenerateUniqueAssetPath($"{directory}/LightProbes.asset");

            // 将光照探针数据保存为独立资源
            AssetDatabase.CreateAsset(lightProbes, lightProbesPath);

            // 刷新资源数据库以确保更改生效
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
#endif
    }
}